home *** CD-ROM | disk | FTP | other *** search
/ BMUG Revelations / BMUG Revelations.toast / Programming / Programming Languages / UCB Logo 3.0 / CSLS / student < prev    next >
Text File  |  1992-09-04  |  33KB  |  1,157 lines

  1. TO ABS :NUM
  2. OP IFELSE (:NUM < 0) [-:NUM] [:NUM]
  3. END
  4.  
  5. TO AGEIFY :SENT
  6. IF EMPTYP :SENT [OUTPUT []]
  7. IF NOT PERSONP FIRST :SENT [OUTPUT FPUT FIRST :SENT AGEIFY BF :SENT]
  8. CATCH "ERROR [IF EQUALP FIRST BF :SENT "S ~
  9.                  [OUTPUT FPUT FIRST :SENT AGEIFY BF :SENT]]
  10. OUTPUT (SE FIRST :SENT [S AGE] AGEIFY BF :SENT)
  11. END
  12.  
  13. TO AGEPROB
  14. LOCAL [BEG END SYM WHO NUM SUBJ AGES]
  15. WHILE [MATCH [^BEG AS OLD AS #END] :PROB] [MAKE "PROB SE :BEG :END]
  16. WHILE [MATCH [^BEG YEARS OLD #END] :PROB] [MAKE "PROB SE :BEG :END]
  17. WHILE [MATCH [^BEG WILL BE WHEN #END] :PROB] ~
  18.       [MAKE "SYM GENSYM ~
  19.        MAKE "PROB (SE :BEG "IN :SYM [YEARS . IN] :SYM "YEARS :END)]
  20. WHILE [MATCH [^BEG WAS WHEN #END] :PROB] ~
  21.       [MAKE "SYM GENSYM ~
  22.        MAKE "PROB (SE :BEG :SYM [YEARS AGO .] :SYM [YEARS AGO] :END)]
  23. WHILE [MATCH [^BEG !WHO:PERSONP WILL BE IN !NUM YEARS #END] :PROB] ~
  24.       [MAKE "PROB (SE :BEG :WHO [S AGE IN] :NUM "YEARS #END)]
  25. WHILE [MATCH [^BEG WAS #END] :PROB] [MAKE "PROB (SE :BEG "IS :END)]
  26. WHILE [MATCH [^BEG WILL BE #END] :PROB] [MAKE "PROB (SE :BEG "IS :END)]
  27. WHILE [MATCH [^BEG !WHO:PERSONP IS NOW #END] :PROB] ~
  28.       [MAKE "PROB (SE :BEG :WHO [S AGE NOW] :END)]
  29. WHILE [MATCH [^BEG !NUM YEARS FROM NOW #END] :PROB] ~
  30.       [MAKE "PROB (SE :BEG "IN :NUM "YEARS :END)]
  31. MAKE "PROB AGEIFY :PROB
  32. IFELSE MATCH [^ !WHO:PERSONP ^END S AGE #] :PROB ~
  33.        [MAKE "SUBJ SE :WHO :END] [MAKE "SUBJ "SOMEONE]
  34. MAKE "PROB AGEPRON :PROB
  35. MAKE "END :PROB
  36. MAKE "AGES []
  37. WHILE [MATCH [^ !WHO:PERSONP ^BEG AGE #END] :END] ~
  38.       [PUSH "AGES (SE "AND :WHO :BEG "AGE)]
  39. MAKE "AGES BF REDUCE "SE REMDUP :AGES
  40. WHILE [MATCH [^BEG THEIR AGES #END] :PROB] [MAKE "PROB (SE :BEG :AGES :END)]
  41. MAKE "SIMSEN MAP [AGESEN ?] BRACKET :PROB
  42. END
  43.  
  44. TO AGEPRON :SENT
  45. IF EMPTYP :SENT [OUTPUT []]
  46. IF NOT PRONOUN FIRST :SENT [OUTPUT FPUT FIRST :SENT AGEPRON BF :SENT]
  47. IF POSSPRO FIRST :SENT [OUTPUT (SE :SUBJ "S AGEPRON BF :SENT)]
  48. OUTPUT (SE :SUBJ [S AGE] AGEPRON BF :SENT)
  49. END
  50.  
  51. TO AGESEN :SENT
  52. LOCAL [WHEN REST NUM]
  53. MAKE "WHEN []
  54. IF MATCH [IN !NUM YEARS #REST] :SENT ~
  55.    [MAKE "WHEN SE "PLUSS :NUM MAKE "SENT :REST]
  56. IF MATCH [!NUM YEARS AGO #REST] :SENT ~
  57.    [MAKE "WHEN SE "MINUSS :NUM MAKE "SENT :REST]
  58. OUTPUT AGEWHEN :SENT
  59. END
  60.  
  61. TO AGEWHEN :SENT
  62. IF EMPTYP :SENT [OUTPUT []]
  63. IF NOT EQUALP FIRST :SENT "AGE [OUTPUT FPUT FIRST :SENT AGEWHEN BF :SENT]
  64. IF MATCH [IN !NUM YEARS #REST] BF :SENT ~
  65.    [OUTPUT (SE [AGE PLUSS] :NUM AGEWHEN :REST)]
  66. IF MATCH [!NUM YEARS AGO #REST] BF :SENT ~
  67.    [OUTPUT (SE [AGE MINUSS] :NUM AGEWHEN :REST)]
  68. IF EQUALP "NOW FIRST BF :SENT [OUTPUT SE "AGE AGEWHEN BF BF :SENT]
  69. OUTPUT (SE "AGE :WHEN AGEWHEN BF :SENT)
  70. END
  71.  
  72. TO ARTICLE :WORD
  73. OP MEMBERP :WORD [A AN THE]
  74. END
  75.  
  76. TO BKT1 :PROBLIST
  77. LOCAL [FIRST WORD REST]
  78. IF EMPTYP :PROBLIST [OUTPUT []]
  79. IF NOT MEMBERP ", FIRST :PROBLIST [OP FPUT FIRST :PROBLIST BKT1 BF :PROBLIST]
  80. IF MATCH [IF ^FIRST , !WORD:QWORD #REST] FIRST :PROBLIST ~
  81.    [OP BKT1 FPUT (SE :FIRST ".) FPUT (SE :WORD :REST) BF :PROBLIST]
  82. IF MATCH [^FIRST , AND #REST] FIRST :PROBLIST ~
  83.    [OP FPUT (SE :FIRST ".) (BKT1 FPUT :REST BF :PROBLIST)]
  84. OP FPUT FIRST :PROBLIST BKT1 BF :PROBLIST
  85. END
  86.  
  87. TO BRACKET :PROB
  88. OUTPUT BKT1 FINDDELIM :PROB
  89. END
  90.  
  91. TO CHANGEONE :CHANGE
  92. LOCAL "END
  93. IF NOT MATCH (SE FIRST :CHANGE [#END]) :SENT [OP "FALSE]
  94. MAKE "SENT RUN (SE "SE LAST :CHANGE ":END)
  95. OP "TRUE
  96. END
  97.  
  98. TO CHANGES :SENT :LIST
  99. LOCAL "KEYWORDS
  100. MAKE "KEYWORDS MAP.SE [FINDKEY FIRST ?] :LIST
  101. OP CHANGES1 :SENT :LIST :KEYWORDS
  102. END
  103.  
  104. TO CHANGES1 :SENT :LIST :KEYWORDS
  105. IF EMPTYP :SENT [OP []]
  106. IF MEMBERP FIRST :SENT :KEYWORDS [OP CHANGES2 :SENT :LIST :KEYWORDS]
  107. OP FPUT FIRST :SENT CHANGES1 BF :SENT :LIST :KEYWORDS
  108. END
  109.  
  110. TO CHANGES2 :SENT :LIST :KEYWORDS
  111. CHANGES3 :LIST :LIST
  112. OP FPUT FIRST :SENT CHANGES1 BF :SENT :LIST :KEYWORDS
  113. END
  114.  
  115. TO CHANGES3 :BIGLIST :NOWLIST
  116. IF EMPTYP :NOWLIST [STOP]
  117. IF CHANGEONE FIRST :NOWLIST [CHANGES3 :BIGLIST :BIGLIST STOP]
  118. CHANGES3 :BIGLIST BF :NOWLIST
  119. END
  120.  
  121. TO DENOM :FRACT :ADDENDS
  122. MAKE "ADDENDS SIMPLUS :ADDENDS
  123. LOCAL "DEN
  124. MAKE "DEN LAST :FRACT
  125. IF NOT EQUALP FIRST :ADDENDS "QUOTIENT ~
  126.    [OP SIMDIV LIST ~
  127.                (SIMONE "SUM ~
  128.                        (REMOP "SUM LIST (DISTRIBTIMES (LIST :ADDENDS) :DEN) ~
  129.                                         FIRST BF :FRACT)) :DEN]
  130. IF EQUALP :DEN LAST :ADDENDS ~
  131.    [OP SIMDIV (SIMPLUS LIST (FIRST BF :FRACT) (FIRST BF :ADDENDS)) :DEN]
  132. LOCAL "LOWTERMS
  133. MAKE "LOWTERMS SIMDIV LIST :DEN LAST :ADDENDS
  134. OP SIMDIV LIST (SIMPLUS (SIMTIMES LIST FIRST BF :FRACT LAST :LOWTERMS) ~
  135.                         (SIMTIMES LIST FIRST BF :ADDENDS FIRST BF :LOWTERMS)) ~
  136.                (SIMTIMES LIST FIRST BF :LOWTERMS LAST :ADDENDS)
  137. END
  138.  
  139. TO DEPUNCT :WORD
  140. IF EMPTYP :WORD [OP []]
  141. IF EQUALP FIRST :WORD "$ [OP SE "$ DEPUNCT BF :WORD]
  142. IF EQUALP LAST :WORD "% [OP SE DEPUNCT BL :WORD "PERCENT]
  143. IF MEMBERP LAST :WORD [. ? |;| ,] [OP SE DEPUNCT BL :WORD LAST :WORD]
  144. IF EMPTYP BF :WORD [OP :WORD]
  145. IF EQUALP LAST2 :WORD "'S [OP SE DEPUNCT BL BL :WORD "S]
  146. OP :WORD
  147. END
  148.  
  149. TO DISTRIBTIMES :TRMS :MULTIPLIER
  150. OP SIMPLUS MAP [SIMTIMES (LIST ? :MULTIPLIER)] :TRMS
  151. END
  152.  
  153. TO DISTRIBX :EXPR
  154. LOCAL [OPER ARGS]
  155. IF EMPTYP :EXPR [OP :EXPR]
  156. MAKE "OPER FIRST :EXPR
  157. IF NOT OPERATORP :OPER [OP :EXPR]
  158. MAKE "ARGS MAP [DISTRIBX ?] BF :EXPR
  159. IF REDUCE "AND MAP [NUMBERP ?] :ARGS [OP RUN (SE [(] :OPER :ARGS [)])]
  160. IF EQUALP :OPER "SUM [OP SIMPLUS :ARGS]
  161. IF EQUALP :OPER "MINUS [OP MINUSIN FIRST :ARGS]
  162. IF EQUALP :OPER "PRODUCT [OP SIMTIMES :ARGS]
  163. IF EQUALP :OPER "QUOTIENT [OP SIMDIV :ARGS]
  164. OP FPUT :OPER :ARGS
  165. END
  166.  
  167. TO DIVTERM :DIVIDEND :DIVISOR
  168. IF EQUALP :DIVIDEND 0 [OP 0]
  169. OP SIMDIV LIST :DIVIDEND :DIVISOR
  170. END
  171.  
  172. TO DLM :WORD
  173. OP MEMBERP :WORD [. ? |;|]
  174. END
  175.  
  176. TO EXPT :NUM :POW
  177. IF :POW < 1 [OP 1]
  178. OP :NUM * EXPT :NUM :POW - 1
  179. END
  180.  
  181. TO FACTOR :EXPRS :VAR
  182. LOCAL "TRMS
  183. MAKE "TRMS MAP [FACTOR1 :VAR ?] :EXPRS
  184. IF MEMBERP "UNKNOWN :TRMS [OP FPUT "UNKNOWN :EXPRS]
  185. OP LIST :VAR SIMPLUS :TRMS
  186. END
  187.  
  188. TO FACTOR1 :VAR :EXPR
  189. LOCAL "NEGVAR
  190. MAKE "NEGVAR MINUSIN :VAR
  191. IF EQUALP :VAR :EXPR [OP 1]
  192. IF EQUALP :NEGVAR :EXPR [OP -1]
  193. IF EMPTYP :EXPR [OP "UNKNOWN]
  194. IF EQUALP FIRST :EXPR "PRODUCT [OP FACTOR2 BF :EXPR]
  195. IF NOT EQUALP FIRST :EXPR "QUOTIENT [OP "UNKNOWN]
  196. LOCAL "DIVIDEND
  197. MAKE "DIVIDEND FIRST BF :EXPR
  198. IF EQUALP :VAR :DIVIDEND [OP (LIST "QUOTIENT 1 LAST :EXPR)]
  199. IF NOT EQUALP FIRST :DIVIDEND "PRODUCT [OP "UNKNOWN]
  200. LOCAL "RESULT
  201. MAKE "RESULT FACTOR2 BF :DIVIDEND
  202. IF EQUALP :RESULT "UNKNOWN [OP "UNKNOWN]
  203. OP (LIST "QUOTIENT :RESULT LAST :EXPR)
  204. END
  205.  
  206. TO FACTOR2 :TRMS
  207. IF MEMBERP :VAR :TRMS [OP SIMONE "PRODUCT (REMOVE :VAR :TRMS)]
  208. IF MEMBERP :NEGVAR :TRMS [OP MINUSIN SIMONE "PRODUCT (REMOVE :NEGVAR :TRMS)]
  209. OP "UNKNOWN
  210. END
  211.  
  212. TO FINDDELIM :SENT
  213. OP FINDDELIM1 :SENT [] []
  214. END
  215.  
  216. TO FINDDELIM1 :IN :OUT :SIMPLES
  217. IF EMPTYP :IN ~
  218.    [IFELSE EMPTYP :OUT [OP :SIMPLES] [OP LPUT (SE :OUT ".) :SIMPLES]]
  219. IF DLM FIRST :IN ~
  220.    [OP FINDDELIM1 (BF :IN) [] (LPUT (SE :OUT FIRST :IN) :SIMPLES)]
  221. OP FINDDELIM1 (BF :IN) (SE :OUT FIRST :IN) :SIMPLES
  222. END
  223.  
  224. TO FINDKEY :PATTERN
  225. IF EQUALP FIRST :PATTERN "!:IN [OP FIRST BF :PATTERN]
  226. IF EQUALP FIRST :PATTERN "?:IN [OP SE (ITEM 2 :PATTERN) (ITEM 3 :PATTERN)]
  227. OP FIRST :PATTERN
  228. END
  229.  
  230. TO GETEQNS :VARS
  231. OP MAP.SE [GPROP VARKEY ? "EQNS] :VARS
  232. END
  233.  
  234. TO IDIOMS :SENT
  235. LOCAL "NUMBER
  236. OP CHANGES :SENT ~
  237.     [[[THE SUM OF] ["SUM]] [[SQUARE OF] ["SQUARE]] [[OF] ["NUMOF]] ~
  238.      [[HOW OLD] ["WHAT]] [[IS EQUAL TO] ["IS]] ~
  239.      [[YEARS YOUNGER THAN] [[LESS THAN]]] [[YEARS OLDER THAN] ["PLUS]] ~
  240.      [[PERCENT LESS THAN] ["PERLESS]] [[LESS THAN] ["LESSTHAN]] ~
  241.      [[THESE] ["THE]] [[MORE THAN] ["PLUS]] ~
  242.      [[FIRST TWO NUMBERS] [[THE FIRST NUMBER AND THE SECOND NUMBER]]] ~
  243.      [[THREE NUMBERS] ~
  244.       [[THE FIRST NUMBER AND THE SECOND NUMBER AND THE THIRD NUMBER]]] ~
  245.      [[ONE HALF] [0.5]] [[TWICE] [[2 TIMES]]] ~
  246.      [[$ !NUMBER] [SE :NUMBER "DOLLARS]] [[CONSECUTIVE TO] [[1 PLUS]]] ~
  247.      [[LARGER THAN] ["PLUS]] [[PER CENT] ["PERCENT]] [[HOW MANY] ["HOWM]] ~
  248.      [[IS MULTIPLIED BY] ["ISMULBY]] [[IS DIVIDED BY] ["ISDIVBY]] ~
  249.      [[MULTIPLIED BY] ["TIMES]] [[DIVIDED BY] ["DIVBY]]]
  250. END
  251.  
  252. TO LAST2 :WORD
  253. OP WORD (LAST BL :WORD) (LAST :WORD)
  254. END
  255.  
  256. TO LSAY :HERALD :TEXT
  257. PR []
  258. PR :HERALD
  259. PR []
  260. FOREACH :TEXT [PR ? PR []]
  261. END
  262.  
  263. TO MAYBEADD :NUM :REST
  264. IF EQUALP :NUM 0 [OP :REST]
  265. OP FPUT :NUM :REST
  266. END
  267.  
  268. TO MAYBEMUL :NUM :REST
  269. IF EQUALP :NUM 1 [OP :REST]
  270. OP FPUT :NUM :REST
  271. END
  272.  
  273. TO MINUSIN :EXPR
  274. IF EMPTYP :EXPR [OP -1]
  275. IF EQUALP FIRST :EXPR "SUM [OP FPUT "SUM MAP [MINUSIN ?] BF :EXPR]
  276. IF EQUALP FIRST :EXPR "MINUS [OP LAST :EXPR]
  277. IF MEMBERP FIRST :EXPR [PRODUCT QUOTIENT] ~
  278.    [OP FPUT FIRST :EXPR (FPUT (MINUSIN FIRST BF :EXPR) BF BF :EXPR)]
  279. IF NUMBERP :EXPR [OP MINUS :EXPR]
  280. OP LIST "MINUS :EXPR
  281. END
  282.  
  283. TO NMTEST :EXPR
  284. IF MATCH [& !:NUMBERP #] :EXPR [SAY [ARGUMENT ERROR:] :EXPR TOPLEVEL]
  285. IF AND (EQUALP FIRST :EXPR 1) (1 < COUNT :EXPR) ~
  286.    [MAKE "EXPR (SE 1 PLURAL (FIRST BF :EXPR) (BF BF :EXPR))]
  287. IF AND (NUMBERP FIRST :EXPR) (1 < COUNT :EXPR) ~
  288.    [PUSH "UNITS (LIST FIRST BF :EXPR) ~
  289.     OP (LIST "PRODUCT (FIRST :EXPR) (OPFORM BF :EXPR))]
  290. IF NUMBERP FIRST :EXPR [OP FIRST :EXPR]
  291. IF MEMBERP "THIS :EXPR [OP THIS :EXPR]
  292. IF NOT MEMBERP :EXPR :VAR [PUSH "VAR :EXPR]
  293. OP :EXPR
  294. END
  295.  
  296. TO OCCVAR :VAR :EXPR
  297. IF EMPTYP :EXPR [OP "FALSE]
  298. IF WORDP :EXPR [OP EQUALP :VAR :EXPR]
  299. IF OPERATORP FIRST :EXPR [OP NOT EMPTYP FIND [OCCVAR :VAR ?] BF :EXPR]
  300. OP EQUALP :VAR :EXPR
  301. END
  302.  
  303. TO OP0 :WORD
  304. OP MEMBERP :WORD [PLUSS MINUSS SQUARED TOTHEPOWER PER SUM DIFFERENCE NUMOF]
  305. END
  306.  
  307. TO OP1 :WORD
  308. OP MEMBERP :WORD [TIMES DIVBY SQUARE]
  309. END
  310.  
  311. TO OP2 :WORD
  312. OP MEMBERP :WORD [PLUS MINUS LESSTHAN PERCENT PERLESS]
  313. END
  314.  
  315. TO OPDIFF :LEFT :RIGHT
  316. OP (LIST "SUM :LEFT (LIST "MINUS :RIGHT))
  317. END
  318.  
  319. TO OPERATORP :WORD
  320. OP MEMBERP :WORD [SUM MINUS PRODUCT QUOTIENT EXPT SQUARE EQUAL]
  321. END
  322.  
  323. TO OPFORM :EXPR
  324. LOCAL [LEFT RIGHT OP]
  325. IF MATCH [^LEFT !OP:OP2 #RIGHT] :EXPR [OP OPTEST :OP :LEFT :RIGHT]
  326. IF MATCH [^LEFT !OP:OP1 #RIGHT] :EXPR [OP OPTEST :OP :LEFT :RIGHT]
  327. IF MATCH [^LEFT !OP:OP0 #RIGHT] :EXPR [OP OPTEST :OP :LEFT :RIGHT]
  328. IF MATCH [#LEFT !:DLM] :EXPR [MAKE "EXPR :LEFT]
  329. OP NMTEST FILTER [NOT ARTICLE ?] :EXPR
  330. END
  331.  
  332. TO OPREM :SENT
  333. OP MAP [IFELSE EQUALP ? "NUMOF ["OF] [?]] :SENT
  334. END
  335.  
  336. TO OPTEST :OP :LEFT :RIGHT
  337. OP RUN (LIST (WORD "TST. :OP) :LEFT :RIGHT)
  338. END
  339.  
  340. TO PERSONP :WORD
  341. OUTPUT MEMBERP :WORD [MARY ANN BILL FATHER UNCLE]
  342. END
  343.  
  344. TO PLURAL :WORD
  345. LOCAL "PLURAL
  346. MAKE "PLURAL GPROP :WORD "PLURAL
  347. IF NOT EMPTYP :PLURAL [OP :PLURAL]
  348. IF NOT EMPTYP GPROP :WORD "SING [OP :WORD]
  349. IF EQUALP LAST :WORD "S [OP :WORD]
  350. OP WORD :WORD "S
  351. END
  352.  
  353. TO POSSPRO :WORD
  354. OP MEMBERP :WORD [HIS HER ITS]
  355. END
  356.  
  357. TO PRANS :ANS :SOLUTION
  358. LOCAL "RESULT
  359. MAKE "RESULT FIND [EQUALP FIRST ? FIRST :ANS] :SOLUTION
  360. IF EMPTYP :RESULT [OP "TRUE]
  361. PR (SE LAST :ANS "IS UNITSTRING LAST :RESULT)
  362. PR []
  363. OP "FALSE
  364. END
  365.  
  366. TO PRANSWERS :ANS :SOLUTION
  367. PR []
  368. IF EQUALP :SOLUTION "UNSOLVABLE ~
  369.    [PR [UNABLE TO SOLVE THIS SET OF EQUATIONS.] OP "FALSE]
  370. IF EQUALP :SOLUTION "INSUFFICIENT ~
  371.    [PR [THE EQUATIONS WERE INSUFFICIENT TO FIND A SOLUTION.] OP "FALSE]
  372. LOCAL "GOTALL
  373. MAKE "GOTALL "TRUE
  374. FOREACH :ANS [IF PRANS ? :SOLUTION [MAKE "GOTALL "FALSE]]
  375. IF NOT :GOTALL [PR [] PR [UNABLE TO SOLVE THIS SET OF EQUATIONS.]]
  376. OP :GOTALL
  377. END
  378.  
  379. TO PRONOUN :WORD
  380. OP MEMBERP :WORD [HE SHE IT HIM HER THEY THEM HIS HER ITS]
  381. END
  382.  
  383. TO QSET :SENT
  384. LOCAL "OPFORM
  385. MAKE "OPFORM OPFORM FILTER [NOT ARTICLE ?] :SENT
  386. IF NOT OPERATORP FIRST :OPFORM ~
  387.    [QUEUE "WANTED :OPFORM QUEUE "ANS LIST :OPFORM OPREM :SENT OP []]
  388. LOCAL "GENSYM
  389. MAKE "GENSYM GENSYM
  390. QUEUE "WANTED :GENSYM
  391. QUEUE "ANS LIST :GENSYM OPREM :SENT
  392. OP (LIST "EQUAL :GENSYM OPFORM (FILTER [NOT ARTICLE ?] :SENT))
  393. END
  394.  
  395. TO QWORD :WORD
  396. OP MEMBERP :WORD [FIND WHAT HOWM HOW]
  397. END
  398.  
  399. TO REMFACTOR :NUM :DEN
  400. FOREACH BF :NUM [REMFACTOR1 ?]
  401. OP (LIST "QUOTIENT (SIMONE "PRODUCT BF :NUM) (SIMONE "PRODUCT BF :DEN))
  402. END
  403.  
  404. TO REMFACTOR1 :EXPR
  405. LOCAL "NEG
  406. IF MEMBERP :EXPR :DEN ~
  407.    [MAKE "NUM REMOVE :EXPR :NUM MAKE "DEN REMOVE :EXPR :DEN STOP]
  408. MAKE "NEG MINUSIN :EXPR
  409. IF NOT MEMBERP :NEG :DEN [STOP]
  410. MAKE "NUM REMOVE :EXPR :NUM
  411. MAKE "DEN MINUSIN REMOVE :NEG :DEN
  412. END
  413.  
  414. TO REMOP :OPER :EXPRS
  415. OP MAP.SE [IFELSE EQUALP FIRST ? :OPER [BF ?] [(LIST ?)]] :EXPRS
  416. END
  417.  
  418. TO ROUNDOFF :NUM
  419. IF (ABS (:NUM - ROUND :NUM)) < 0.0001 [OP ROUND :NUM]
  420. OP :NUM
  421. END
  422.  
  423. TO SAY :HERALD :TEXT
  424. PR []
  425. PR :HERALD
  426. PR []
  427. PR :TEXT
  428. PR []
  429. END
  430.  
  431. TO SENFORM :SENT
  432. MAKE "LASTEQN SENFORM1 :SENT
  433. OP :LASTEQN
  434. END
  435.  
  436. TO SENFORM1 :SENT
  437. LOCAL [ONE TWO VERB1 VERB2 STUFF1 STUFF2 FACTOR]
  438. IF EMPTYP :SENT [OP []]
  439. IF MATCH [^ WHAT ARE ^ONE AND ^TWO !:DLM] :SENT ~
  440.    [OP FPUT (QSET :ONE) (SENFORM (SE [WHAT ARE] :TWO "?))]
  441. IF MATCH [^ WHAT !:IN [IS ARE] #ONE !:DLM] :SENT ~
  442.    [OP (LIST QSET :ONE)]
  443. IF MATCH [^ HOWM !ONE IS #TWO !:DLM] :SENT ~
  444.    [PUSH "AUNITS (LIST :ONE) OP (LIST QSET :TWO)]
  445. IF MATCH [^ HOWM ^ONE DO ^TWO HAVE !:DLM] :SENT ~
  446.    [OP (LIST QSET (SE [THE NUMBER OF] :ONE :TWO "HAVE))]
  447. IF MATCH [^ HOWM ^ONE DOES ^TWO HAVE !:DLM] :SENT ~
  448.    [OP (LIST QSET (SE [THE NUMBER OF] :ONE :TWO "HAS))]
  449. IF MATCH [^ FIND ^ONE AND #TWO] :SENT ~
  450.    [OP FPUT (QSET :ONE) (SENFORM SE "FIND :TWO)]
  451. IF MATCH [^ FIND #ONE !:DLM] :SENT [OP (LIST QSET :ONE)]
  452. MAKE "SENT FILTER [NOT ARTICLE ?] :SENT
  453. IF MATCH [^ONE ISMULBY #TWO] :SENT ~
  454.    [PUSH "REF (LIST "PRODUCT OPFORM :ONE OPFORM :TWO) OP []]
  455. IF MATCH [^ONE ISDIVBY #TWO] :SENT ~
  456.    [PUSH "REF (LIST "QUOTIENT OPFORM :ONE OPFORM :TWO) OP []]
  457. IF MATCH [^ONE IS INCREASED BY #TWO] :SENT ~
  458.    [PUSH "REF (LIST "SUM OPFORM :ONE OPFORM :TWO) OP []]
  459. IF MATCH [^ONE IS #TWO] :SENT ~
  460.    [OP (LIST (LIST "EQUAL OPFORM :ONE OPFORM :TWO))]
  461. IF MATCH ~
  462.      [^ONE !VERB1:VERB ^FACTOR AS MANY ^STUFF1 AS ^TWO !VERB2:VERB ^STUFF2 !:DLM] ~
  463.      :SENT ~
  464.    [IF EMPTYP :STUFF2 [MAKE "STUFF2 :STUFF1] ~
  465.     OP (LIST (LIST "EQUAL ~
  466.                    OPFORM (SE [THE NUMBER OF] :STUFF1 :ONE :VERB1) ~
  467.                    OPFORM (SE :FACTOR [THE NUMBER OF] :STUFF2 :TWO :VERB2)))]
  468. IF MATCH [^ONE !VERB1:VERB !FACTOR:NUMBERP #STUFF1 !:DLM] :SENT ~
  469.    [OP (LIST (LIST "EQUAL ~
  470.                    OPFORM (SE [THE NUMBER OF] :STUFF1 :ONE :VERB1) ~
  471.                    OPFORM (LIST :FACTOR)))]
  472. SAY [THIS SENTENCE FORM IS NOT RECOGNIZED:] :SENT
  473. TOPLEVEL
  474. END
  475.  
  476. TO SETMINUS :BIG :LITTLE
  477. OP FILTER [NOT MEMBERP ? :LITTLE] :BIG
  478. END
  479.  
  480. TO SIMDIV :LIST
  481. LOCAL [NUM DEN NUMOP DENOP]
  482. MAKE "NUM FIRST :LIST
  483. MAKE "DEN LAST :LIST
  484. IF EQUALP :NUM :DEN [OP 1]
  485. IF NUMBERP :DEN [OP SIMTIMES (LIST (QUOTIENT 1 :DEN) :NUM)]
  486. MAKE "NUMOP FIRST :NUM
  487. MAKE "DENOP FIRST :DEN
  488. IF EQUALP :NUMOP "QUOTIENT ~
  489.    [OP SIMDIV LIST (FIRST BF :NUM) (SIMTIMES LIST LAST :NUM :DEN)]
  490. IF EQUALP :DENOP "QUOTIENT ~
  491.    [OP SIMDIV LIST (SIMTIMES LIST :NUM LAST :DEN) (FIRST BF :DEN)]
  492. IF AND EQUALP :NUMOP "PRODUCT EQUALP :DENOP "PRODUCT [OP REMFACTOR :NUM :DEN]
  493. IF AND EQUALP :NUMOP "PRODUCT MEMBERP :DEN :NUM [OP REMOVE :DEN :NUM]
  494. OP FPUT "QUOTIENT :LIST
  495. END
  496.  
  497. TO SIMONE :OPER :TRMS
  498. IF EMPTYP :TRMS [OP IFELSE EQUALP :OPER "PRODUCT [1] [0]]
  499. IF EMPTYP BF :TRMS [OP FIRST :TRMS]
  500. OP FPUT :OPER :TRMS
  501. END
  502.  
  503. TO SIMPLUS :EXPRS
  504. MAKE "EXPRS REMOP "SUM :EXPRS
  505. LOCAL "FACTOR
  506. MAKE "FACTOR [UNKNOWN]
  507. CATCH "SIMPLUS ~
  508.       [FOREACH :TERMS ~
  509.                [MAKE "FACTOR (FACTOR :EXPRS ?) ~
  510.                 IF NOT EQUALP FIRST :FACTOR "UNKNOWN [THROW "SIMPLUS]]]
  511. IF NOT EQUALP FIRST :FACTOR "UNKNOWN [OP FPUT "PRODUCT REMOP "PRODUCT :FACTOR]
  512. LOCAL [NUMS NONNUMS QUICK]
  513. MAKE "NUMS 0
  514. MAKE "NONNUMS []
  515. MAKE "QUICK []
  516. CATCH "SIMPLUS [SIMPLUS1 :EXPRS]
  517. IF NOT EMPTYP :QUICK [OP :QUICK]
  518. IF NOT EQUALP :NUMS 0 [PUSH "NONNUMS :NUMS]
  519. OP SIMONE "SUM :NONNUMS
  520. END
  521.  
  522. TO SIMPLUS1 :EXPRS
  523. IF EMPTYP :EXPRS [STOP]
  524. SIMPLUS2 FIRST :EXPRS
  525. SIMPLUS1 BF :EXPRS
  526. END
  527.  
  528. TO SIMPLUS2 :POS
  529. LOCAL "NEG
  530. MAKE "NEG MINUSIN :POS
  531. IF NUMBERP :POS [MAKE "NUMS SUM :POS :NUMS STOP]
  532. IF MEMBERP :NEG BF :EXPRS [MAKE "EXPRS REMOVE :NEG :EXPRS STOP]
  533. IF EQUALP FIRST :POS "QUOTIENT ~
  534.    [MAKE "QUICK (DENOM :POS (MAYBEADD :NUMS SE :NONNUMS BF :EXPRS)) ~
  535.     THROW "SIMPLUS]
  536. PUSH "NONNUMS :POS
  537. END
  538.  
  539. TO SIMTIMES :EXPRS
  540. LOCAL [NUMS NONNUMS QUICK]
  541. MAKE "NUMS 1
  542. MAKE "NONNUMS []
  543. MAKE "QUICK []
  544. CATCH "SIMTIMES [FOREACH REMOP "PRODUCT :EXPRS [SIMTIMES1 ?]]
  545. IF NOT EMPTYP :QUICK [OP :QUICK]
  546. IF EQUALP :NUMS 0 [OP 0]
  547. IF NOT EQUALP :NUMS 1 [PUSH "NONNUMS :NUMS]
  548. OP SIMONE "PRODUCT :NONNUMS
  549. END
  550.  
  551. TO SIMTIMES1 :EXPR
  552. IF EQUALP :EXPR 0 [MAKE "NUMS 0 THROW "SIMTIMES]
  553. IF NUMBERP :EXPR [MAKE "NUMS PRODUCT :EXPR :NUMS STOP]
  554. IF EQUALP FIRST :EXPR "SUM ~
  555.    [MAKE "QUICK DISTRIBTIMES (BF :EXPR) ~
  556.                              (SIMONE "PRODUCT MAYBEMUL :NUMS SE :NONNUMS ?REST) ~
  557.     THROW "SIMTIMES]
  558. IF EQUALP FIRST :EXPR "QUOTIENT ~
  559.    [MAKE "QUICK ~
  560.           SIMDIV (LIST (SIMTIMES (LIST (FIRST BF :EXPR) ~
  561.                                        (SIMONE "PRODUCT ~
  562.                                                MAYBEMUL :NUMS ~
  563.                                                         SE :NONNUMS ?REST))) ~
  564.                        (LAST :EXPR)) ~
  565.     THROW "SIMTIMES]
  566. PUSH "NONNUMS :EXPR
  567. END
  568.  
  569. TO SINGULAR :WORD
  570. LOCAL "SING
  571. MAKE "SING GPROP :WORD "SING
  572. IF NOT EMPTYP :SING [OP :SING]
  573. IF NOT EMPTYP GPROP :WORD "PLURAL [OP :WORD]
  574. IF EQUALP LAST :WORD "S [OP BL :WORD]
  575. OP :WORD
  576. END
  577.  
  578. TO SOLVE :WANTED :EQT :TERMS
  579. OP SOLVE.REDUCE SOLVER :WANTED :TERMS [] [] "INSUFFICIENT
  580. END
  581.  
  582. TO SOLVE.REDUCE :SOLN
  583. IF EMPTYP :SOLN [OP []]
  584. IF WORDP :SOLN [OP :SOLN]
  585. IF EMPTYP BF :SOLN [OP :SOLN]
  586. LOCAL "PART
  587. MAKE "PART SOLVE.REDUCE BF :SOLN
  588. OP FPUT (LIST (FIRST FIRST :SOLN) (SUBORD LAST FIRST :SOLN :PART)) :PART
  589. END
  590.  
  591. TO SOLVE1 :X :TERMS :ALIS :EQNS :FAILED :ERR
  592. LOCAL [THISEQ VARS EXTRAS XTERMS OTHERS RESULT]
  593. IF EMPTYP :EQNS [OP :ERR]
  594. MAKE "THISEQ SUBORD (FIRST :EQNS) :ALIS
  595. MAKE "VARS VARTERMS :THISEQ
  596. IF NOT MEMBERP :X :VARS ~
  597.    [OP SOLVE1 :X :TERMS :ALIS (BF :EQNS) (FPUT FIRST :EQNS :FAILED) :ERR]
  598. MAKE "XTERMS FPUT :X :TERMS
  599. MAKE "EXTRAS SETMINUS :VARS :XTERMS
  600. MAKE "EQT REMOVE (FIRST :EQNS) :EQT
  601. IF NOT EMPTYP :EXTRAS ~
  602.    [MAKE "OTHERS SOLVER :EXTRAS :XTERMS :ALIS [] "INSUFFICIENT ~
  603.     IFELSE WORDP :OTHERS ~
  604.            [MAKE "EQT SE :FAILED :EQNS ~
  605.             OP SOLVE1 :X :TERMS :ALIS (BF :EQNS) ~
  606.                       (FPUT FIRST :EQNS :FAILED) :OTHERS] ~
  607.            [MAKE "ALIS :OTHERS ~
  608.             MAKE "THISEQ SUBORD (FIRST :EQNS) :ALIS]]
  609. MAKE "RESULT SOLVEQ :X :THISEQ
  610. IF LISTP :RESULT [OP LPUT :RESULT :ALIS]
  611. MAKE "EQT SE :FAILED :EQNS
  612. OP SOLVE1 :X :TERMS :ALIS (BF :EQNS) (FPUT FIRST :EQNS :FAILED) :RESULT
  613. END
  614.  
  615. TO SOLVEQ :VAR :EQN
  616. LOCAL [LEFT RIGHT]
  617. MAKE "LEFT FIRST BF :EQN
  618. IFELSE OCCVAR :VAR :LEFT ~
  619.    [MAKE "RIGHT LAST :EQN] [MAKE "RIGHT :LEFT MAKE "LEFT LAST :EQN]
  620. OP SOLVEQ1 :LEFT :RIGHT "TRUE
  621. END
  622.  
  623. TO SOLVEQ.MINUS
  624. OP SOLVEQ1 (FIRST BF :LEFT) (MINUSIN :RIGHT) "FALSE
  625. END
  626.  
  627. TO SOLVEQ.PRODUCT
  628. OP SOLVEQ.PRODUCT1 :LEFT :RIGHT
  629. END
  630.  
  631. TO SOLVEQ.PRODUCT1 :LEFT :RIGHT
  632. IF EMPTYP BF BF :LEFT [OP SOLVEQ1 (FIRST BF :LEFT) :RIGHT "TRUE]
  633. IF NOT OCCVAR :VAR FIRST BF :LEFT ~
  634.    [OP SOLVEQ.PRODUCT1 (FPUT "PRODUCT BF BF :LEFT) ~
  635.                        (DIVTERM :RIGHT FIRST BF :LEFT)]
  636. LOCAL "REST
  637. MAKE "REST SIMONE "PRODUCT BF BF :LEFT
  638. IF OCCVAR :VAR :REST [OP "UNSOLVABLE]
  639. OP SOLVEQ1 (FIRST BF :LEFT) (DIVTERM :RIGHT :REST) "FALSE
  640. END
  641.  
  642. TO SOLVEQ.QUOTIENT
  643. IF OCCVAR :VAR FIRST BF :LEFT ~
  644.    [OP SOLVEQ1 (FIRST BF :LEFT) (SIMTIMES LIST :RIGHT LAST :LEFT) "TRUE]
  645. OP SOLVEQ1 (SIMTIMES LIST :RIGHT LAST :LEFT) (FIRST BF :LEFT) "TRUE
  646. END
  647.  
  648. TO SOLVEQ.RPLUS :LEFT :RIGHT :NEWRIGHT
  649. IF EMPTYP :RIGHT [OP SOLVEQ1 :LEFT (SIMONE "SUM :NEWRIGHT) "FALSE]
  650. IF OCCVAR :VAR FIRST :RIGHT ~
  651.    [OP SOLVEQ.RPLUS (SUBTERM :LEFT FIRST :RIGHT) BF :RIGHT :NEWRIGHT]
  652. OP SOLVEQ.RPLUS :LEFT BF :RIGHT (FPUT FIRST :RIGHT :NEWRIGHT)
  653. END
  654.  
  655. TO SOLVEQ.SUM
  656. IF EMPTYP BF BF :LEFT [OP SOLVEQ1 FIRST BF :LEFT :RIGHT "TRUE]
  657. OP SOLVEQ.SUM1 BF :LEFT :RIGHT []
  658. END
  659.  
  660. TO SOLVEQ.SUM1 :LEFT :RIGHT :NEWLEFT
  661. IF EMPTYP :LEFT [OP SOLVEQ.SUM2]
  662. IF OCCVAR :VAR FIRST :LEFT ~
  663.    [OP SOLVEQ.SUM1 BF :LEFT :RIGHT FPUT FIRST :LEFT :NEWLEFT]
  664. OP SOLVEQ.SUM1 BF :LEFT (SUBTERM :RIGHT FIRST :LEFT) :NEWLEFT
  665. END
  666.  
  667. TO SOLVEQ.SUM2
  668. IF EMPTYP BF :NEWLEFT [OP SOLVEQ1 FIRST :NEWLEFT :RIGHT "TRUE]
  669. LOCAL "FACTOR
  670. MAKE "FACTOR FACTOR :NEWLEFT :VAR
  671. IF EQUALP FIRST :FACTOR "UNKNOWN [OP "UNSOLVABLE]
  672. IF EQUALP LAST :FACTOR 0 [OP "UNSOLVABLE]
  673. OP SOLVEQ1 FIRST :FACTOR (DIVTERM :RIGHT LAST :FACTOR) "TRUE
  674. END
  675.  
  676. TO SOLVEQ1 :LEFT :RIGHT :BOTHTEST
  677. IF :BOTHTEST [IF OCCVAR :VAR :RIGHT [OP SOLVEQBOTH :LEFT :RIGHT]]
  678. IF EQUALP :LEFT :VAR [OP LIST :VAR :RIGHT]
  679. IF WORDP :LEFT [OP "UNSOLVABLE]
  680. LOCAL "OPER
  681. MAKE "OPER FIRST :LEFT
  682. IF MEMBERP :OPER [SUM PRODUCT MINUS QUOTIENT] [OP RUN (LIST WORD "SOLVEQ. :OPER)]
  683. OP "UNSOLVABLE
  684. END
  685.  
  686. TO SOLVEQBOTH :LEFT :RIGHT
  687. IF NOT EQUALP FIRST :RIGHT "SUM [OP SOLVEQ1 (SUBTERM :LEFT :RIGHT) 0 "FALSE]
  688. OP SOLVEQ.RPLUS :LEFT BF :RIGHT []
  689. END
  690.  
  691. TO SOLVER :WANTED :TERMS :ALIS :FAILED :ERR
  692. LOCAL [ONE RESULT RESTWANT]
  693. IF EMPTYP :WANTED [OP :ERR]
  694. MAKE "ONE SOLVE1 (FIRST :WANTED) ~
  695.                  (SE BF :WANTED :FAILED :TERMS) :ALIS :EQT [] "INSUFFICIENT
  696. IF WORDP :ONE ~
  697.    [OP SOLVER (BF :WANTED) :TERMS :ALIS (FPUT FIRST :WANTED :FAILED) :ONE]
  698. MAKE "RESTWANT (SE :FAILED BF :WANTED)
  699. IF EMPTYP :RESTWANT [OP :ONE]
  700. MAKE "RESULT SOLVER :RESTWANT :TERMS :ONE [] "INSUFFICIENT
  701. IF LISTP :RESULT [OP :RESULT]
  702. OP SOLVER (BF :WANTED) :TERMS :ALIS (FPUT FIRST :WANTED :FAILED) :ONE
  703. END
  704.  
  705. TO SQUARE :X
  706. OP :X * :X
  707. END
  708.  
  709. TO STUDENT :PROB
  710. LOCAL "ORGPROB
  711. SAY [THE PROBLEM TO BE SOLVED IS] :PROB
  712. MAKE "PROB MAP.SE [DEPUNCT ?] :PROB
  713. MAKE "ORGPROB :PROB
  714. STUDENT1 :PROB ~
  715.          [[[THE PERIMETER OF ! RECTANGLE] ~
  716.            [TWICE THE SUM OF THE LENGTH AND WIDTH OF THE RECTANGLE]] ~
  717.           [[TWO NUMBERS] [ONE OF THE NUMBERS AND THE OTHER NUMBER]] ~
  718.           [[TWO NUMBERS] [ONE NUMBER AND THE OTHER NUMBER]]]
  719. END
  720.  
  721. TO STUDENT1 :PROB :IDIOMS
  722. LOCAL [SIMSEN SHELF AUNITS UNITS WANTED ANS VAR LASTEQN ~
  723.         REF EQT1 BEG END IDIOM REPLY]
  724. MAKE "PROB IDIOMS :PROB
  725. IF MATCH [^ TWO NUMBERS #] :PROB ~
  726.    [MAKE "IDIOM FIND [MATCH (SE "^BEG FIRST ? "#END) :ORGPROB] :IDIOMS ~
  727.     TRYIDIOM STOP]
  728. WHILE [MATCH [^BEG THE THE #END] :PROB] [MAKE "PROB (SE :BEG "THE :END)]
  729. SAY [WITH MANDATORY SUBSTITUTIONS THE PROBLEM IS] :PROB
  730. IFELSE MATCH [# @:IN [[AS OLD AS] [AGE] [YEARS OLD]] #] :PROB ~
  731.        [AGEPROB] [MAKE "SIMSEN BRACKET :PROB]
  732. LSAY [THE SIMPLE SENTENCES ARE] :SIMSEN
  733. MAKE "AUNITS []
  734. MAKE "WANTED []
  735. MAKE "ANS []
  736. MAKE "VAR []
  737. MAKE "LASTEQN []
  738. MAKE "REF []
  739. MAKE "UNITS []
  740. MAKE "SHELF FILTER [NOT EMPTYP ?] MAP.SE [SENFORM ?] :SIMSEN
  741. LSAY [THE EQUATIONS TO BE SOLVED ARE] :SHELF
  742. MAKE "UNITS REMDUP :UNITS
  743. IF TRYSOLVE :SHELF :WANTED :UNITS :AUNITS [PR [THE PROBLEM IS SOLVED.] STOP]
  744. MAKE "EQT1 REMDUP GETEQNS :VAR
  745. IF NOT EMPTYP :EQT1 [LSAY [USING THE FOLLOWING KNOWN RELATIONSHIPS] :EQT1]
  746. STUDENT2 :EQT1
  747. END
  748.  
  749. TO STUDENT2 :EQT1
  750. MAKE "VAR REMDUP SE (MAP.SE [VARTERMS ?] :EQT1) :VAR
  751. MAKE "EQT1 SE :EQT1 VARTEST :VAR
  752. IF NOT EMPTYP :EQT1 ~
  753.    [IF TRYSOLVE (SE :SHELF :EQT1) :WANTED :UNITS :AUNITS ~
  754.        [PR [THE PROBLEM IS SOLVED.] STOP]]
  755. MAKE "IDIOM FIND [MATCH (SE "^BEG FIRST ? "#END) :ORGPROB] :IDIOMS
  756. IF NOT EMPTYP :IDIOM [TRYIDIOM STOP]
  757. LSAY [DO YOU KNOW ANY MORE RELATIONSHIPS AMONG THESE VARIABLES?] :VAR
  758. MAKE "REPLY RL
  759. IF EQUALP :REPLY [YES] [PR [TELL ME.] MAKE "REPLY RL]
  760. IF EQUALP :REPLY [NO] [PR [] PR [I CAN'T SOLVE THIS PROBLEM.] STOP]
  761. MAKE "REPLY MAP.SE [DEPUNCT ?] :REPLY
  762. IF DLM LAST :REPLY [MAKE "REPLY BL :REPLY]
  763. IF NOT MATCH [^BEG IS #END] :REPLY [PR [I DON'T UNDERSTAND THAT.] STOP]
  764. MAKE "SHELF SE :SHELF :EQT1
  765. STUDENT2 (LIST (LIST "EQUAL OPFORM :BEG OPFORM :END))
  766. END
  767.  
  768. TO SUBORD :EXPR :ALIST
  769. OP DISTRIBX SUBORD1 :EXPR :ALIST
  770. END
  771.  
  772. TO SUBORD1 :EXPR :ALIST
  773. IF EMPTYP :ALIST [OP :EXPR]
  774. OP SUBORD (SUBSTOP (LAST FIRST :ALIST) (FIRST FIRST :ALIST) :EXPR) ~
  775.           (BF :ALIST)
  776. END
  777.  
  778. TO SUBSTOP :VAL :VAR :EXPR
  779. IF EMPTYP :EXPR [OP []]
  780. IF EQUALP :EXPR :VAR [OP :VAL]
  781. IF NOT OPERATORP FIRST :EXPR [OP :EXPR]
  782. OP FPUT FIRST :EXPR MAP [SUBSTOP :VAL :VAR ?] BF :EXPR
  783. END
  784.  
  785. TO SUBTERM :MINUEND :SUBTRAHEND
  786. IF EQUALP :MINUEND 0 [OP MINUSIN :SUBTRAHEND]
  787. IF EQUALP :MINUEND :SUBTRAHEND [OP 0]
  788. OP SIMPLUS (LIST :MINUEND MINUSIN :SUBTRAHEND)
  789. END
  790.  
  791. TO THIS :EXPR
  792. IF NOT EMPTYP :REF [OP POP "REF]
  793. IF NOT EMPTYP :LASTEQN [OP FIRST BF LAST :LASTEQN]
  794. IF EQUALP FIRST :EXPR "THIS [MAKE "EXPR BF :EXPR]
  795. PUSH "VAR :EXPR
  796. OP :EXPR
  797. END
  798.  
  799. TO TRYIDIOM
  800. MAKE "PROB (SE :BEG LAST :IDIOM :END)
  801. WHILE [MATCH (SE "^BEG FIRST :IDIOM "#END) :PROB] ~
  802.       [MAKE "PROB (SE :BEG LAST :IDIOM :END)]
  803. SAY [THE PROBLEM WITH AN IDIOMATIC SUBSTITUTION IS] :PROB
  804. STUDENT1 :PROB (REMOVE :IDIOM :IDIOMS)
  805. END
  806.  
  807. TO TRYSOLVE :SHELF :WANTED :UNITS :AUNITS
  808. LOCAL "SOLUTION
  809. MAKE "SOLUTION SOLVE :WANTED :SHELF (IFELSE EMPTYP :AUNITS [:UNITS] [:AUNITS])
  810. OP PRANSWERS :ANS :SOLUTION
  811. END
  812.  
  813. TO TST.DIFFERENCE :LEFT :RIGHT
  814. LOCAL [ONE TWO]
  815. IF MATCH [BETWEEN ^ONE AND #TWO] :RIGHT [OP OPDIFF OPFORM :ONE OPFORM :TWO]
  816. SAY [INCORRECT USE OF DIFFERENCE:] :RIGHT
  817. TOPLEVEL
  818. END
  819.  
  820. TO TST.DIVBY :LEFT :RIGHT
  821. OP (LIST "QUOTIENT OPFORM :LEFT OPFORM :RIGHT)
  822. END
  823.  
  824. TO TST.LESSTHAN :LEFT :RIGHT
  825. OP OPDIFF OPFORM :RIGHT OPFORM :LEFT
  826. END
  827.  
  828. TO TST.MINUS :LEFT :RIGHT
  829. IF EMPTYP :LEFT [OP LIST "MINUS OPFORM :RIGHT]
  830. OP OPDIFF OPFORM :LEFT OPFORM :RIGHT
  831. END
  832.  
  833. TO TST.MINUSS :LEFT :RIGHT
  834. OP TST.MINUS :LEFT :RIGHT
  835. END
  836.  
  837. TO TST.NUMOF :LEFT :RIGHT
  838. IF NUMBERP LAST :LEFT [OP (LIST "PRODUCT OPFORM :LEFT OPFORM :RIGHT)]
  839. OP OPFORM (SE :LEFT "OF :RIGHT)
  840. END
  841.  
  842. TO TST.PER :LEFT :RIGHT
  843. OP (LIST "QUOTIENT ~
  844.           OPFORM :LEFT ~
  845.           OPFORM (IFELSE NUMBERP FIRST :RIGHT [:RIGHT] [FPUT 1 :RIGHT]))
  846. END
  847.  
  848. TO TST.PERCENT :LEFT :RIGHT
  849. IF NOT NUMBERP LAST :LEFT ~
  850.    [SAY [INCORRECT USE OF PERCENT:] :LEFT TOPLEVEL]
  851. OP OPFORM (SE BL :LEFT ((LAST :LEFT) / 100) :RIGHT)
  852. END
  853.  
  854. TO TST.PERLESS :LEFT :RIGHT
  855. IF NOT NUMBERP LAST :LEFT ~
  856.    [SAY [INCORRECT USE OF PERCENT:] :LEFT TOPLEVEL]
  857. OP (LIST "PRODUCT ~
  858.           (OPFORM SE BL :LEFT ((100 - (LAST :LEFT)) / 100)) ~
  859.           OPFORM :RIGHT)
  860. END
  861.  
  862. TO TST.PLUS :LEFT :RIGHT
  863. OP (LIST "SUM OPFORM :LEFT OPFORM :RIGHT)
  864. END
  865.  
  866. TO TST.PLUSS :LEFT :RIGHT
  867. OP TST.PLUS :LEFT :RIGHT
  868. END
  869.  
  870. TO TST.SQUARE :LEFT :RIGHT
  871. OP LIST "SQUARE OPFORM :RIGHT
  872. END
  873.  
  874. TO TST.SQUARED :LEFT :RIGHT
  875. OP LIST "SQUARE OPFORM :LEFT
  876. END
  877.  
  878. TO TST.SUM :LEFT :RIGHT
  879. LOCAL [ONE TWO THREE]
  880. IF MATCH [^ONE AND ^TWO AND #THREE] :RIGHT ~
  881.    [OP (LIST "SUM OPFORM :ONE OPFORM (SE "SUM :TWO "AND :THREE))]
  882. IF MATCH [^ONE AND #TWO] :RIGHT ~
  883.    [OP (LIST "SUM OPFORM :ONE OPFORM :TWO)]
  884. SAY [SUM USED WRONG:] :RIGHT
  885. TOPLEVEL
  886. END
  887.  
  888. TO TST.TIMES :LEFT :RIGHT
  889. IF EMPTYP :LEFT [SAY [INCORRECT USE OF TIMES:] :RIGHT TOPLEVEL]
  890. OP (LIST "PRODUCT OPFORM :LEFT OPFORM :RIGHT)
  891. END
  892.  
  893. TO TST.TOTHEPOWER :LEFT :RIGHT
  894. OP (LIST "EXPT OPFORM :LEFT OPFORM :RIGHT)
  895. END
  896.  
  897. TO UNITSTRING :EXPR
  898. IF NUMBERP :EXPR [OP ROUNDOFF :EXPR]
  899. IF EQUALP FIRST :EXPR "PRODUCT ~
  900.    [OP SE (UNITSTRING FIRST BF :EXPR) (REDUCE "SE BF BF :EXPR)]
  901. IF (AND (LISTP :EXPR) ~
  902.          (NOT NUMBERP FIRST :EXPR) ~
  903.          (NOT OPERATORP FIRST :EXPR)) ~
  904.    [OP (SE 1 (SINGULAR FIRST :EXPR) (BF :EXPR))]
  905. OP :EXPR
  906. END
  907.  
  908. TO VAREQUAL :TARGET :VAR
  909. PR []
  910. PR [ASSUMING THAT]
  911. PR (SE (LIST :TARGET) [IS EQUAL TO] (LIST :VAR))
  912. OP (LIST "EQUAL :TARGET :VAR)
  913. END
  914.  
  915. TO VARKEY :VAR
  916. LOCAL "WORD
  917. IF MATCH [NUMBER OF !WORD #] :VAR [OP :WORD]
  918. OP FIRST :VAR
  919. END
  920.  
  921. TO VARTERMS :EXPR
  922. IF EMPTYP :EXPR [OP []]
  923. IF NUMBERP :EXPR [OP []]
  924. IF WORDP :EXPR [OP (LIST :EXPR)]
  925. IF OPERATORP FIRST :EXPR [OP MAP.SE [VARTERMS ?] BF :EXPR]
  926. OP (LIST :EXPR)
  927. END
  928.  
  929. TO VARTEST :VARS
  930. IF EMPTYP :VARS [OP []]
  931. LOCAL [VAR BEG END]
  932. MAKE "VAR FIRST :VARS
  933. OP (SE (IFELSE MATCH [^BEG !:PRONOUN #END] :VAR ~
  934.                  [VARTEST1 :VAR (SE :BEG "& :END) BF :VARS] ~
  935.                  [[]]) ~
  936.        (VARTEST1 :VAR (SE "# :VAR "#) BF :VARS) (VARTEST BF :VARS))
  937. END
  938.  
  939. TO VARTEST1 :TARGET :PAT :VARS
  940. OP MAP [VAREQUAL :TARGET ?] FILTER [MATCH :PAT ?] :VARS
  941. END
  942.  
  943. TO VERB :WORD
  944. OP MEMBERP :WORD [HAVE HAS GET GETS WEIGH WEIGHS]
  945. END
  946.  
  947. TO MATCH :PAT :SEN
  948. IF PREMATCH :PAT :SEN [OP RMATCH :PAT :SEN]
  949. OP "FALSE
  950. END
  951.  
  952. TO PREMATCH :PAT :SEN
  953. IF EMPTYP :PAT [OP "TRUE]
  954. IF LISTP FIRST :PAT [OP PREMATCH BF :PAT :SEN]
  955. IF MEMBERP FIRST FIRST :PAT [! @ # ^ & ?] [OP PREMATCH BF :PAT :SEN]
  956. IF EMPTYP :SEN [OP "FALSE]
  957. IF MEMBERP FIRST :PAT :SEN [OP PREMATCH BF :PAT :SEN]
  958. OP "FALSE
  959. END
  960.  
  961. TO MATCH!
  962. IF EMPTYP :SEN [OP "FALSE]
  963. IF NOT TRY.PRED [OP "FALSE]
  964. MAKE :SPECIAL.VAR FIRST :SEN
  965. OP RMATCH BF :PAT BF :SEN
  966. END
  967.  
  968. TO MATCH#
  969. MAKE :SPECIAL.VAR []
  970. OP #TEST #GATHER :SEN
  971. END
  972.  
  973. TO #GATHER :SEN
  974. IF EMPTYP :SEN [OP :SEN]
  975. IF NOT TRY.PRED [OP :SEN]
  976. MAKE :SPECIAL.VAR LPUT FIRST :SEN THING :SPECIAL.VAR
  977. OP #GATHER BF :SEN
  978. END
  979.  
  980. TO #TEST :SEN
  981. IF RMATCH BF :PAT :SEN [OP "TRUE]
  982. IF EMPTYP THING :SPECIAL.VAR [OP "FALSE]
  983. OP #TEST2 FPUT LAST THING :SPECIAL.VAR :SEN
  984. END
  985.  
  986. TO #TEST2 :SEN
  987. MAKE :SPECIAL.VAR BL THING :SPECIAL.VAR
  988. OP #TEST :SEN
  989. END
  990.  
  991. TO MATCH&
  992. OP &TEST MATCH#
  993. END
  994.  
  995. TO &TEST :TF
  996. IF EMPTYP THING :SPECIAL.VAR [OP "FALSE]
  997. OP :TF
  998. END
  999.  
  1000. TO MATCH?
  1001. MAKE :SPECIAL.VAR []
  1002. IF EMPTYP :SEN [OP RMATCH BF :PAT :SEN]
  1003. IF NOT TRY.PRED [OP RMATCH BF :PAT :SEN]
  1004. MAKE :SPECIAL.VAR FIRST :SEN
  1005. IF RMATCH BF :PAT BF :SEN [OP "TRUE]
  1006. MAKE :SPECIAL.VAR []
  1007. OP RMATCH BF :PAT :SEN
  1008. END
  1009.  
  1010. TO MATCH@
  1011. MAKE :SPECIAL.VAR :SEN
  1012. OP @TEST []
  1013. END
  1014.  
  1015. TO @TEST :SEN
  1016. IF @TRY.PRED [IF RMATCH BF :PAT :SEN [OP "TRUE]]
  1017. IF EMPTYP THING :SPECIAL.VAR [OP "FALSE]
  1018. OP @TEST2 FPUT LAST THING :SPECIAL.VAR :SEN
  1019. END
  1020.  
  1021. TO @TEST2 :SEN
  1022. MAKE :SPECIAL.VAR BL THING :SPECIAL.VAR
  1023. OP @TEST :SEN
  1024. END
  1025.  
  1026. TO @TRY.PRED
  1027. IF LISTP :SPECIAL.PRED [OP RMATCH :SPECIAL.PRED THING :SPECIAL.VAR]
  1028. OP RUN LIST :SPECIAL.PRED THING :SPECIAL.VAR
  1029. END
  1030.  
  1031. TO MATCH^
  1032. MAKE :SPECIAL.VAR []
  1033. OUTPUT ^TEST :SEN
  1034. END
  1035.  
  1036. TO ^TEST :SEN
  1037. IF RMATCH BF :PAT :SEN [OUTPUT "TRUE]
  1038. IF EMPTYP :SEN [OUTPUT "FALSE]
  1039. IF NOT TRY.PRED [OUTPUT "FALSE]
  1040. MAKE :SPECIAL.VAR LPUT FIRST :SEN THING :SPECIAL.VAR
  1041. OUTPUT ^TEST BF :SEN
  1042. END
  1043.  
  1044. TO ALWAYS :X
  1045. OP "TRUE
  1046. END
  1047.  
  1048. TO ANYOF :SEN
  1049. OP ANYOF1 :SEN :IN.LIST
  1050. END
  1051.  
  1052. TO ANYOF1 :SEN :PATS
  1053. IF EMPTYP :PATS [OP "FALSE]
  1054. IF RMATCH FIRST :PATS :SEN [OP "TRUE]
  1055. OP ANYOF1 :SEN BF :PATS
  1056. END
  1057.  
  1058. TO IN :WORD
  1059. OP MEMBERP :WORD :IN.LIST
  1060. END
  1061.  
  1062. TO RMATCH :PAT :SEN
  1063. LOCAL [SPECIAL.VAR SPECIAL.PRED SPECIAL.BUFFER IN.LIST]
  1064. IF OR WORDP :PAT WORDP :SEN [OP "FALSE]
  1065. IF EMPTYP :PAT [OP EMPTYP :SEN]
  1066. IF LISTP FIRST :PAT [OP SPECIAL FPUT "!: :PAT :SEN]
  1067. IF MEMBERP FIRST FIRST :PAT [? # ! & @ ^] [OP SPECIAL :PAT :SEN]
  1068. IF EMPTYP :SEN [OP "FALSE]
  1069. IF EQUALP FIRST :PAT FIRST :SEN [OP RMATCH BF :PAT BF :SEN]
  1070. OP "FALSE
  1071. END
  1072.  
  1073. TO PARSE.SPECIAL :WORD :VAR
  1074. IF EMPTYP :WORD [OP LIST :VAR "ALWAYS]
  1075. IF EQUALP FIRST :WORD ": [OP LIST :VAR BF :WORD]
  1076. OP PARSE.SPECIAL BF :WORD WORD :VAR FIRST :WORD
  1077. END
  1078.  
  1079. TO QUOTED :THING
  1080. IF LISTP :THING [OP :THING]
  1081. OP WORD "" :THING
  1082. END
  1083.  
  1084. TO SET.IN
  1085. MAKE "IN.LIST FIRST BF :PAT
  1086. MAKE "PAT FPUT FIRST :PAT BF BF :PAT
  1087. END
  1088.  
  1089. TO SET.SPECIAL :LIST
  1090. MAKE "SPECIAL.VAR FIRST :LIST
  1091. MAKE "SPECIAL.PRED LAST :LIST
  1092. IF EMPTYP :SPECIAL.VAR [MAKE "SPECIAL.VAR "SPECIAL.BUFFER]
  1093. IF MEMBERP :SPECIAL.PRED [IN ANYOF] [SET.IN]
  1094. IF NOT EMPTYP :SPECIAL.PRED [STOP]
  1095. MAKE "SPECIAL.PRED FIRST BF :PAT
  1096. MAKE "PAT FPUT FIRST :PAT BF BF :PAT
  1097. END
  1098.  
  1099. TO SPECIAL :PAT :SEN
  1100. SET.SPECIAL PARSE.SPECIAL BF FIRST :PAT "
  1101. OP RUN FPUT WORD "MATCH FIRST FIRST :PAT []
  1102. END
  1103.  
  1104. TO TRY.PRED
  1105. IF LISTP :SPECIAL.PRED [OP RMATCH :SPECIAL.PRED FIRST :SEN]
  1106. OP RUN LIST :SPECIAL.PRED QUOTED FIRST :SEN
  1107. END
  1108.  
  1109. MAKE "ANN [MARY IS TWICE AS OLD AS ANN WAS WHEN MARY WAS AS OLD AS ANN IS NOW. ~
  1110.   IF MARY IS 24 YEARS OLD, HOW OLD IS ANN?]
  1111. MAKE "GUNS [THE NUMBER OF SOLDIERS THE RUSSIANS HAVE IS ~
  1112.   ONE HALF OF THE NUMBER OF GUNS THEY HAVE. THEY HAVE 7000 GUNS. ~
  1113.   HOW MANY SOLDIERS DO THEY HAVE?]
  1114. MAKE "JET [THE DISTANCE FROM NEW YORK TO LOS ANGELES IS 3000 MILES. ~
  1115.   IF THE AVERAGE SPEED OF A JET PLANE IS 600 MILES PER HOUR, ~
  1116.   FIND THE TIME IT TAKES TO TRAVEL FROM NEW YORK TO LOS ANGELES BY JET.]
  1117. MAKE "NUMS [A NUMBER IS MULTIPLIED BY 6 . THIS PRODUCT IS INCREASED BY 44 . ~
  1118.   THIS RESULT IS 68 . FIND THE NUMBER.]
  1119. MAKE "RADIO [THE PRICE OF A RADIO IS $69.70. ~
  1120.   IF THIS PRICE IS 15 PERCENT LESS THAN THE MARKED PRICE, FIND THE MARKED PRICE.]
  1121. MAKE "SALLY [THE SUM OF SALLY'S SHARE OF SOME MONEY AND FRANK'S SHARE IS $4.50. ~
  1122.   SALLY'S SHARE IS TWICE FRANK'S. FIND FRANK'S AND SALLY'S SHARE.]
  1123. MAKE "SHIP [THE GROSS WEIGHT OF A SHIP IS 20000 TONS. ~
  1124.   IF ITS NET WEIGHT IS 15000 TONS, WHAT IS THE WEIGHT OF THE SHIPS CARGO?]
  1125. MAKE "SPAN [IF 1 SPAN IS 9 INCHES, AND 1 FATHOM IS 6 FEET, ~
  1126.   HOW MANY SPANS IS 1 FATHOM?]
  1127. MAKE "SUMTWO [THE SUM OF TWO NUMBERS IS 96, ~
  1128.   AND ONE NUMBER IS 16 LARGER THAN THE OTHER NUMBER. FIND THE TWO NUMBERS.]
  1129. MAKE "TOM [IF THE NUMBER OF CUSTOMERS TOM GETS IS ~
  1130.   TWICE THE SQUARE OF 20 PER CENT OF THE NUMBER OF ADVERTISEMENTS HE RUNS, ~
  1131.   AND THE NUMBER OF ADVERTISEMENTS HE RUNS IS 45, ~
  1132.   WHAT IS THE NUMBER OF CUSTOMERS TOM GETS?]
  1133. MAKE "UNCLE [BILL'S FATHER'S UNCLE IS TWICE AS OLD AS BILL'S FATHER. ~
  1134.   2 YEARS FROM NOW BILL'S FATHER WILL BE 3 TIMES AS OLD AS BILL. ~
  1135.   THE SUM OF THEIR AGES IS 92 . FIND BILL'S AGE.]
  1136.  
  1137. PPROP "DISTANCE "EQNS ~
  1138.   [[EQUAL [DISTANCE] [PRODUCT [SPEED] [TIME]]] ~
  1139.    [EQUAL [DISTANCE] [PRODUCT [GAS CONSUMTION] [NUMBER OF GALLONS OF GAS USED]]]]
  1140. PPROP "FEET "EQNS ~
  1141.   [[EQUAL [PRODUCT 1 [FEET]] [PRODUCT 12 [INCHES]]] ~
  1142.    [EQUAL [PRODUCT 1 [YARDS]] [PRODUCT 3 [FEET]]]]
  1143. PPROP "FEET "SING "FOOT
  1144. PPROP "FOOT "PLURAL "FEET
  1145. PPROP "GALLONS "EQNS ~
  1146.   [[EQUAL [DISTANCE] [PRODUCT [GAS CONSUMTION] [NUMBER OF GALLONS OF GAS USED]]]]
  1147. PPROP "GAS "EQNS ~  
  1148.   [[EQUAL [DISTANCE] [PRODUCT [GAS CONSUMTION] [NUMBER OF GALLONS OF GAS USED]]]]
  1149. PPROP "INCH "PLURAL "INCHES
  1150. PPROP "INCHES "EQNS [[EQUAL [PRODUCT 1 [FEET]] [PRODUCT 12 [INCHES]]]]
  1151. PPROP "PEOPLE "SING "PERSON
  1152. PPROP "PERSON "PLURAL "PEOPLE
  1153. PPROP "SPEED "EQNS [[EQUAL [DISTANCE] [PRODUCT [SPEED] [TIME]]]]
  1154. PPROP "TIME "EQNS [[EQUAL [DISTANCE] [PRODUCT [SPEED] [TIME]]]]
  1155. PPROP "YARDS "EQNS [[EQUAL [PRODUCT 1 [YARDS]] [PRODUCT 3 [FEET]]]]
  1156.  
  1157.